package com.sky.mapper;

import com.sky.annotation.AutoFill;
import com.sky.entity.Dish;
import com.sky.enumeration.OperationType;
import com.sky.vo.DishVO;
import org.apache.ibatis.annotations.*;

import java.util.List;

/**
 * 菜品数据持久层接口
 */
// @Mapper
public interface DishMapper {

    /**
     * 根据分类id查询菜品数量
     *
     * @param categoryId
     * @return
     */
    @Select("select count(*) from dish where category_id = #{categoryId}")
    Integer countByCategoryId(Long categoryId);

    /**
     * 新增菜品
     *
     * @param dish 菜品
     * @return 影响的行数
     */
    @Insert("insert into dish (`name`, category_id, price, image, description, create_time, update_time, create_user,update_user, status)" +
            "         values (#{name}, #{categoryId}, #{price}, #{image}, #{description}, #{createTime}, #{updateTime}, #{createUser},#{updateUser}, #{status})")
    // useGeneratedKeys属性表示使用数据库自增生成的id ，keyProperty属性指定接收该id的实体类属性名
    // 效果：通过该方法把一条数据插入的数据库，会自动将id设置进实体类的id属性
    @Options(useGeneratedKeys = true, keyProperty = "id")
    @AutoFill(OperationType.INSERT)
    int insert(Dish dish);

    /**
     * 根据菜品名称查询重名数量
     *
     * @param dish 包含名称的实体类对象（可能包含ID）
     * @return
     */
    int selectCountByName(Dish dish);

    /**
     * 根据条件查询所有
     *
     * @param dish 查询条件
     * @return 符合条件的所有菜品对象
     */
    //
    List<DishVO> selectByCondition(Dish dish);

    /**
     * 根据id们查询多个菜品
     *
     * @param ids id们
     * @return 多个菜品
     */
    List<Dish> selectByIds(List<Long> ids);

    /**
     * 根据菜品ids批量删除菜品
     *
     * @param ids 菜品id们
     * @return 成功删除的个数
     */
    int deleteByIds(List<Long> ids);

    /**
     * 根据id，修改菜品（按需更新）
     *
     * @param dish 菜品
     * @return 修改的结果
     */
    @AutoFill(OperationType.UPDATE)
    int updateById(Dish dish);

    /**
     * 根据套餐id，查询当前套餐中所有的菜品
     *
     * @param setmealId
     * @return
     */
    @Select("select * from dish  d left join setmeal_dish sd on d.id = sd.dish_Id where " +
            "setmeal_id = #{setmealId}")
    List<Dish> selectBySetmealId(Long setmealId);

    /**
     * 查询指定分类下的所有菜品（隐含条件：在售菜品）
     *
     * @param categoryId 分类id
     * @return
     */
    @Select("select * from dish d left join category c on d.category_id = c.id where c.id = " +
            "#{categoryId} and d.status = 1")
    List<Dish> selectByCategoryId(@Param("categoryId") Long categoryId);
}
